package ar.edu.utn.frba.dds.opendesigners.reservas;


import java.util.LinkedList;
import java.util.Queue;

import ar.edu.utn.frba.dds.opendesigners.excepciones.ExcepcionSobreReservaAsiento;
import ar.edu.utn.frba.dds.opendesigners.resultados.Asiento
;
import ar.edu.utn.frba.dds.opendesigners.user.Usuario;

public class Reserva {
	private Asiento asiento;
	private Queue<Usuario> usuarios = new LinkedList<Usuario>();
	
	public Reserva(Asiento asiento, Usuario usuario){
		this.asiento = asiento;
		//Tama: Le agrego el if not null porque sino en el "estaLaReserva" pincha
		if (usuario != null){
			this.agregarSobreReserva(usuario);
			this.reservar();
		}
	}
	
	/**
	 * Agrega una sobrereserva para @usuario . 
	 */
	public void agregarSobreReserva(Usuario usuario){
		if(this.reservoUsuario(usuario))
			throw new ExcepcionSobreReservaAsiento();
		this.usuarios.add(usuario);
	}
	
	private boolean reservoUsuario(Usuario usuario) {
		for (Usuario usuarioQueReservo : this.usuarios) {
			if(usuarioQueReservo.equals(usuario))
				return true;
		}
		return false;
	}

	/**
	 * Quita la reserva al usuario actual. Si no hay usuarios en sobre-reserva retorna true.
	 */
	public void expiroReserva(){
		this.quitarReservaActual();
		if(this.haySobreReserva()){
			this.reservar();
		}
	}
	
	/**
	 * Metodos internos
	 **/
	private void reservar() {
		this.asiento.setDni(this.usuarios.peek().getDni());
		this.asiento.reservar();
	}

	private boolean haySobreReserva() {
		return !(this.usuarios.isEmpty());		
	}

	private void quitarReservaActual() {
		this.usuarios.poll();
	}

	public Asiento getAsiento(){
		return this.asiento;
	}
	
	public boolean equals(Reserva reserva){
		return this.asiento.equals(reserva.asiento);
	}
}
